#include "core/Symbol.hpp"

namespace sympy
{
    void bxCreateSymPyFunction(
        int nlhs, bxArray *plhs[],
        int nrhs, const bxArray *prhs[]);

    void bxCallSymPyFunctionOneArg(
        const char *funcname,
        int nlhs, bxArray *plhs[],
        int nrhs, const bxArray *prhs[]);

    static inline void
    bxSymPySin(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("sin", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPySinh(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("sinh", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyArcSin(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("asin", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyArcSinh(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("asinh", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyCos(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("cos", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyArcCos(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("acos", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyArcCosh(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("acosh", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyExp(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("exp", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyLog(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("log", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPySqrt(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("sqrt", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyTan(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("tan", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyTanh(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("tanh", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyArcTan(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("atan", nlhs, plhs, nrhs, prhs);
    };

    static inline void
    bxSymPyArcTanh(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[])
    {
        bxCallSymPyFunctionOneArg("atanh", nlhs, plhs, nrhs, prhs);
    };
} // namespace symbolic
